package work.linruchang.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

import java.util.List;
import java.util.Map;

/**
 * 增强的对象处理工具
 *
 * @author LinRuChang
 * @version 1.0
 * @date 2021/12/08
 * @since 1.8
 **/
public class EnhanceObjectUtil extends ObjectUtil {

    /**
     * 获取层级value  【每个层级Key会下划线、驼峰都查】
     * @param tragetObj 目标元素  支持Bean以及Map
     * @param key 键值  通过分割符获取第几层的键值  使用英文句号进行分割
     * @return
     */
    public static Object getValue(Object tragetObj, String key) {
        return getValue(tragetObj, key, StrUtil.DOT);
    }

    /**
     * 获取层级value 【每个层级Key会下划线、驼峰都查】
     * @param tragetObj 目标元素  支持Bean以及Map
     * @param key 键值  通过分割符获取第几层的键值  分割separator
     * @param separator 分割符 空则默认英文句号.
     * @return
     */
    public static Object getValue(Object tragetObj, String key, String separator) {
        separator = StrUtil.blankToDefault(separator,StrUtil.DOT);
        Object result = null;
        if(isAllNotEmpty(tragetObj,key)) {
            List<String> sonKeys = StrUtil.split(key, ".");
            int index = 0;
            Object tempResult = tragetObj;
            for( String sonKey : sonKeys ) {
                if(tempResult == null) {break;}
                Object columnValue1 = null;
                Object columnValue2 = null;
                if(tempResult instanceof Map) {
                    columnValue1 = ((Map)tempResult).get(sonKey);
                    columnValue2 = ((Map)tempResult).get(EnhanceStrUtil.camelTransfersBetweenUnderline(sonKey));
                }else {
                    columnValue1 = EnhanceReflectUtil.getFieldValue(tempResult,sonKey);
                    columnValue2 = EnhanceReflectUtil.getFieldValue(tempResult, EnhanceStrUtil.camelTransfersBetweenUnderline(sonKey));
                }
                tempResult = ObjectUtil.defaultIfNull(columnValue1, columnValue2);
                index++;
            }

            //层级字段获取到结果
            if(sonKeys.size() == index) {
                result = tempResult;
            }
        }
        return result;
    }


}
